package inputjadwal.service.implementasi;

import inputjadwal.entity.Dosen;
import inputjadwal.entity.Mahasiswa;
import inputjadwal.entity.MataKuliah;
import inputjadwal.entity.Tingkat;
import inputjadwal.service.inter.Pengajaran;
import java.util.List;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;


@Service
@Transactional(readOnly=true)
public class PengajaranImplementasi implements Pengajaran {
    
    @Autowired private SessionFactory sessionFactory;

    @Override
    @Transactional(readOnly=false)
    public void saveDosen(Dosen dosen) {
        sessionFactory.getCurrentSession().saveOrUpdate(dosen);
    }

    @Override
    @Transactional(readOnly=false)
    public void deleteDosen(Dosen dosen) {
        sessionFactory.getCurrentSession().delete(dosen);
    }

    @Override
    @Transactional(readOnly=false)
    public void saveMahasiswa(Mahasiswa mahasiswa) {
        sessionFactory.getCurrentSession().saveOrUpdate(mahasiswa);
    }

    @Override
    @Transactional(readOnly=false)
    public void deleteMahasiswa(Mahasiswa mahasiswa) {
        sessionFactory.getCurrentSession().delete(mahasiswa);
    }

    @Override
    @Transactional(readOnly=false)
    public void saveTingkat(Tingkat tingkat) {
        sessionFactory.getCurrentSession().saveOrUpdate(tingkat);
    }

    @Override
    @Transactional(readOnly=false)
    public void deleteTingkat(Tingkat tingkat) {
        sessionFactory.getCurrentSession().delete(tingkat);
    }

    @Override
    @Transactional(readOnly=false)
    public void saveMataKuliah(MataKuliah matakuliah) {
        sessionFactory.getCurrentSession().saveOrUpdate(matakuliah);
    }

    @Override
    @Transactional(readOnly=false)
    public void deleteMataKuliah(MataKuliah matakuliah) {
         sessionFactory.getCurrentSession().delete(matakuliah);
    }

    @Override
    @Transactional(readOnly=false)
    public List<Dosen> findAllDosen() {
        return sessionFactory.getCurrentSession().createQuery("from Dosen").list();
    }

    @Override
    @Transactional(readOnly=false)
    public List<MataKuliah> findAllMataKuliah() {
        return sessionFactory.getCurrentSession().createQuery("from MataKuliah").list();
    }

    @Override
    @Transactional(readOnly=false)
    public List<Tingkat> findAllTingkat() {
        return sessionFactory.getCurrentSession().createQuery("from Tingkat").list();
    }

    @Override
    @Transactional(readOnly=false)
    public List<Mahasiswa> findAllMahasiswa() {
        return sessionFactory.getCurrentSession().createQuery("from Mahasiswa").list();

    }

    @Override
    public Mahasiswa findMahasiswaByNIM(String NIM) {
        return (Mahasiswa) sessionFactory.getCurrentSession().createQuery("from Mahasiswa m where m.NIM = :nim")
                .setParameter("m", NIM)
                .uniqueResult();
    }

    @Override
    public Mahasiswa findMahasiswaByAngkatan(String angkatan) {
        return (Mahasiswa) sessionFactory.getCurrentSession().createQuery("from Mahasiswa m where m.angkatan = :angkatan")
                .setParameter("m", angkatan)
                .uniqueResult();
    }

    @Override
    public Mahasiswa findMahasiswaByMataKuliah(String matakuliah) {
        return (Mahasiswa) sessionFactory.getCurrentSession().createQuery("from Mahasiswa m where m.matakuliah = :matakuliah")
                .setParameter("m", matakuliah)
                .uniqueResult();
    }

    @Override
    public Mahasiswa findMahasiswaByDosen (String dosen) {
        return (Mahasiswa) sessionFactory.getCurrentSession().createQuery("from Mahasiswa m where m.dosen = :dosen")
                .setParameter("m", dosen)
                .uniqueResult();
        }
}
